import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { useUserStoreHook } from "@/store/modules/user";
import router from '@/router'

// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 50000,
  headers: { "Content-Type": "application/json;charset=utf-8" },
});

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const userStore = useUserStoreHook();
    if (userStore.token) {
      config.headers.Authorization = userStore.token;
    }
    return config;
  },
  (error: any) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    //始终执行：只要请求完成（无论是成功还是失败）
    //只会在 HTTP 状态码为 2xx 的情况下才会执行（status）
    const data = response.data;
    // 处理二进制流（如 Excel 导出）
    if (data instanceof ArrayBuffer) {
      return response;
    }

    const { code } = data;
    if (code === 200) {
      return data;
    }
  },
  (error: any) => {
    //1、当请求发送到服务器时，如果网络连接中断、服务器宕机或服务器没有响应
    //2、如果服务器返回了非 2xx 的 HTTP 状态码（status）
    console.log(error.response);

    // 对响应错误做点什么
    if (!error.response) {
      // 网络错误或请求超时
      ElMessage.error('网络连接异常，请检查网络');
      return Promise.reject(error);
    }

    const status = error.response.status;
    const message = error.response.data?.message || '请求错误';

    switch (status) {
      case 400:
        ElMessage.error(`错误请求: ${message}`);
        break;
      case 401:
        ElMessage.error('未授权，请重新登录');
        // 清除 token 并跳转到登录页
        sessionStorage.removeItem('X-token');
        router.push('/login');
        break;
      case 403:
        ElMessage.error('拒绝访问: 您没有权限执行此操作');
        // 可以跳转到无权限页面
        router.push('/403');
        break;
      case 404:
        ElMessage.error('请求的资源不存在');
        break;
      case 408:
        ElMessage.error('请求超时');
        break;
      case 500:
        ElMessage.error('服务器内部错误');
        router.push('/500');
        break;
      case 501:
        ElMessage.error('服务未实现');
        break;
      case 502:
        ElMessage.error('网关错误');
        break;
      case 503:
        ElMessage.error('服务不可用');
        break;
      case 504:
        ElMessage.error('网关超时');
        break;
      case 505:
        ElMessage.error('HTTP版本不受支持');
        break;
      default:
        //ElMessage.error(`连接错误: ${message}`);
        return Promise.reject(error);
    }

    return Promise.reject(error);
  }
);

// 导出 axios 实例
export default service;
